package com.hama.iotrust.common.mvc;

import java.net.MalformedURLException;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;

import org.apache.commons.lang.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.util.AntPathMatcher;



public class PermissionsSource {

    private static final Logger           LOGGER      = LoggerFactory.getLogger(PermissionsSource.class);

//    private UserService                   userService;
    private Set<String>                   exclusions;

    public Set<String> getExclusions() {
        return exclusions;
    }


    public void setExclusions(Set<String> exclusions) {
        this.exclusions = exclusions;
    }

    private AntPathMatcher                urlMatcher  = new AntPathMatcher();
    private Map<String, Collection<Long>> resourceMap = new ConcurrentHashMap<String, Collection<Long>>();

//    public PermissionsSource(UserService userService){
//        this.userService = userService;
//        reloadResources();
//    }
//
//    public void reloadResources() {
//        try {
//            LOGGER.info("加载权限资源:");
//            resourceMap.clear();
//            List<SysRole> allRoles = userService.findAllRoles();
//
//            // 默认权限
//            List<SysModule> defaultModules = userService.findAllDefaultModules();
//            // 角色权限
//            for (SysRole role : allRoles) {
//                List<SysModule> modules = userService.findModulesByRoleId(role.getRoleId());
//                modules.addAll(defaultModules);
//                for (SysModule module : modules) {
//                    String moduleUrl = module.getModuleUrl();
//                    if (StringUtils.isEmpty(moduleUrl)) {
//                        moduleUrl = "";
//                    }
//                    Collection<Long> resourceRoles = null;
//                    Long roleId = role.getRoleId();
//                    String[] urls = moduleUrl.split("\\s+|,");
//                    for (String url : urls) {
//                        if (resourceMap.containsKey(url)) {
//                            resourceRoles = resourceMap.get(url);
//                            resourceRoles.add(roleId);
//                        } else {
//                            resourceRoles = new ArrayList<Long>();
//                            resourceRoles.add(roleId);
//                            resourceMap.put(url, resourceRoles);
//                        }
//                    }
//                }
//            }
//            LOGGER.info("加载权限资源结束");
//        } catch (ServiceException se) {
//            LOGGER.error("加载权限资源出错:" + se.getMessage(), se);
//        }
//    }

    public boolean resourceMatchRoles(String url, List<Long> roleIds) throws IllegalArgumentException,
                                                                     MalformedURLException {
        Iterator<Entry<String, Collection<Long>>> it = resourceMap.entrySet().iterator();
        while (it.hasNext()) {
            Entry<String, Collection<Long>> entry = it.next();
            String _url = entry.getKey();
            if (StringUtils.isEmpty(_url)) {
                continue;
            }
            if (_url.startsWith("./")) {
                _url = _url.substring(1);
            }
            if (_url.indexOf("?") != -1) {
                _url = _url.substring(0, _url.indexOf("?"));
            }
            if (urlMatcher.match(_url, url)) {
                Collection<Long> storedRoleIds = entry.getValue();
                for (Long roleId : roleIds) {
                    if (storedRoleIds.contains(roleId)) {
                        return true;
                    }
                }
            }
        }
        return false;
    }
}
